/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.marlboroug.users;

import com.marlboroug.entity.Users;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;


@Stateless
public class UsersManager implements UsersManagerRemote {

    @PersistenceContext(unitName = "Marlboroug-ejbPU")
    EntityManager em;

    /** Permet de créer un utilisateur
     * 
     * @param user_send Envoie un objet de type Users
     * @return Un boolean pour confirmer la création
     */
    @Override
    public Boolean create (Users user_send) {
        Boolean resultat = true; //Resultat de la recherche
        //On vérifie que username n'existe pas
        List<Users> temp = FindCreateUser(user_send.getUsername());
        for (Users n : temp) {
            resultat = false;
        } 
        if(resultat){
            em.persist(user_send);
            return true;
        }else {
            return false;
        }
    }

    /** Permet de supprimer un utilisateur
     * 
     * @param ID_users Envoie un ID d'un utilisateur
     */
    @Override
    public void delete (Long ID_users) {
        Users user = em.find(Users.class, ID_users);
        em.remove(user);
    }
    
    /** Permet de retourner un objet Users en fonction d'un ID
     * 
     * @param ID_users Un ID d'un utilisateur
     * @return Un objet utilisateur
     */
    @Override
    public Users find (Long ID_users) {
        Users user = em.find(Users.class, ID_users);
        return user;
    }

    /** Permet de mettre à jour un utilisateur
     * 
     * @param users Envoie un objet utilisateur
     */
    @Override
    public void update (Users users) {
        em.merge(users);
    }
    
    /** Pour vérifier le username d'un utilisateur
     * 
     * @param pattern Envoie le username à tester
     * @return Un objet de type Users
     */
    @Override
    public List<Users> AuthentificationUsername (String pattern) {       
        String q = "SELECT m FROM Users m WHERE m.username LIKE :pattern";
        TypedQuery<Users> query = em.createQuery(q, Users.class);
        query.setParameter("pattern", pattern);
        List<Users> user = query.getResultList();
        return user;
    }
    
    /** Pour vérifier le MDP d'un utilisateur
     * 
     * @param pattern Envoie le MDP à tester
     * @return Un objet de type Users
     */
    @Override
    public List<Users> AuthentificationPassword (String pattern) {       
        String q = "SELECT m FROM Users m WHERE m.password LIKE :pattern";
        TypedQuery<Users> query = em.createQuery(q, Users.class);
        query.setParameter("pattern", pattern);
        List<Users> user = query.getResultList();
        return user;
    }
    
    /** Permet de retourner un utilisateur en fonction d'un nom
     * 
     * @param pattern Un nom
     * @return Un utilisateur
     */
    @Override
    public List<Users> FindCreateUser (String pattern) {       
        String q = "SELECT m FROM Users m WHERE m.username LIKE :pattern";
        TypedQuery<Users> query = em.createQuery(q, Users.class);
        query.setParameter("pattern", pattern);
        List<Users> user = query.getResultList();
        return user;
    }
    
    /** Permet de mettre à jour un utilisateur
     * 
     * @param user Envoie un objet user
     * @return Un boolean pour confirmer la modification
     */
    @Override
    public Boolean ModifyUser (Users user) {  
        //On vérifie que l'user existe bien avant changement        
        Users user_temp = find(user.getIDusers());
        if(user_temp.getIDusers() == user.getIDusers()){
            em.merge(user); 
            return true;
        }
        return false;         
    }
}
